/*
 * Model.cs : Realiza a parte lógica do negócio entre o utilizador e a fonte de dados.
 * 
 * Autor: Bruno Barbosa
 * Número: 5321
 * 
 * Sistema: Ubuntu 10.10
 * Aplicação: MonoDevelop v2.4
 * 
 */

using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;

namespace UniDP
{
	public class Model
	{
		DB db;
		List<string> list;
		
		/* Constructor */
		public Model ()
		{
			this.db = new DB();
			this.list = new List<string>();
		}
		
		/*
		 * Instrucções SQL de contagem de Docentes. Recebe o número da instrucção a invocar
		 * e as variáveis necessárias.
		 */
		public int teacherNumber(int expr, string ano, string estab, string grau)//string[] args)
		{
			string expression = "";
			switch(expr)
			{
				/* [ -c ] Conta os professores com recurso ao ano, estabelecimento e grau */
				case 1: expression = "SELECT count(id) FROM docente WHERE id in "+
									 "(SELECT docente_id FROM registodocencia WHERE ano="+ano+" AND estabelecimento_id in"+
									 "(SELECT id FROM estabelecimento WHERE designacao='"+estab+"') AND grau_id in"+
									 "(SELECT id FROM grau WHERE ciclo_estudos_id="+grau+"))";
									 break;
				
				/* [ -c ] Conta os professores com recurso ao ano, estabelecimento */
				case 2: expression = "SELECT count(id) FROM docente WHERE id in "+
									 "(SELECT docente_id FROM registodocencia WHERE ano="+ano+" AND estabelecimento_id in"+
									 "(SELECT id FROM estabelecimento WHERE designacao='"+estab+"'))";
									 break;
				
				/* [ -c ] Conta os professores com recurso ao ano e grau */
				case 3: expression = "SELECT count(id) FROM docente WHERE id in "+
									 "(SELECT docente_id FROM registodocencia WHERE ano="+ano+" AND grau_id in"+
									 "(SELECT id FROM grau WHERE ciclo_estudos_id="+grau+"))";
									 break;
				
				/* [ -c ] Conta os professores com recurso ao ano */
				case 4: expression = "SELECT count(id) FROM docente WHERE ano="+ano;
									 break;
				
				/* [ -cD ] Conta os professores com doutoramento, recurso ao estabelecimento e ano*/
				case 5: expression = "SELECT count(id) FROM docente WHERE id in "+
									 "(SELECT docente_id FROM registodocencia WHERE ano="+ano+" AND estabelecimento_id in"+
									 "(SELECT id FROM estabelecimento WHERE designacao='"+estab+"') AND grau_id in"+
									 "(SELECT id FROM grau WHERE ciclo_estudos_id=3))";
									 break;
				/*case 6: expression = "SELECT nome FROM docente WHERE id in "+ 
									 "(SELECT docente_id  FROM registodocencia WHERE ano="+ano+" AND  estabelecimento_id in "+ 
									 "(SELECT id FROM estabelecimento WHERE designacao='"+estab+"') AND grau_id in "+
									 "(SELECT id FROM grau WHERE ciclo_estudos_id="+grau+")) "+
									 "INTERSECT "+
									 "SELECT docente_id  FROM registodocencia WHERE ano="+(Convert.ToInt16(ano)+1)+" AND estabelecimento_id in "+ 
									 "(SELECT id FROM estabelecimento WHERE designacao='"+estab+"')";
									 break;*/
			}
			int response;
			
			/* Realiza a ligação à BD e executa os comandos SQL. Retorna a contagem! */
			try{
				db.connect();
				IDataReader dr = db.command(expression);
				dr.Read();
				response = Convert.ToInt32(dr.GetString(0));
				db.close();
			}catch{
				response = -1; 
			}
			return response;
		}
		
		public List<string> genLists(int expr, string ano, string estab, string grau)
		{
			string expression = "";
			switch(expr)
			{
				/* [ -lE ] Lista os estabelecimentos com recurso ao ano */
				case 1: expression = "SELECT designacao FROM estabelecimento WHERE ano="+ano;
									 break;
				
				/* [ -lP ] Lista os detentores de qualquer grau, com recurso ao ano e ao respectivo grau */
				case 2: expression = "SELECT nome FROM docente WHERE id in "+
									 "(SELECT docente_id FROM registograduacao WHERE ano="+ano+" AND grau_id in"+
									 "(SELECT id FROM grau WHERE ciclo_estudos_id="+grau+"))";
									 break;
				
				/* [ -lS ] Lista o pessoal que saiu de determinada instituição, com recurso ao ano e estabelecimento */
				case 3: expression = "SELECT nome FROM docente WHERE id in "+ 
									 "(SELECT docente_id  FROM registodocencia WHERE ano="+ano+" AND  estabelecimento_id in "+ 
									 "(SELECT id FROM estabelecimento WHERE designacao='"+estab+"')) "+
									 "EXCEPT "+
									 "SELECT nome FROM docente WHERE id in "+ 
									 "(SELECT docente_id  FROM registodocencia WHERE ano="+(Convert.ToInt16(ano)+1)+" AND estabelecimento_id in "+ 
									 "(SELECT id FROM estabelecimento WHERE designacao='"+estab+"'))";
									 break;
				
				/* [ -lN ] Lista o pessoal que entrou em determinada instituição, com recurso ao ano e estabelecimento */
				case 4: expression = "SELECT nome FROM docente WHERE id in "+ 
									 "(SELECT docente_id  FROM registodocencia WHERE ano="+ano+" AND  estabelecimento_id in "+ 
									 "(SELECT id FROM estabelecimento WHERE designacao='"+estab+"')) "+
									 "EXCEPT "+
									 "SELECT nome FROM docente WHERE id in "+ 
									 "(SELECT docente_id  FROM registodocencia WHERE ano="+(Convert.ToInt16(ano)-1)+" AND estabelecimento_id in "+ 
									 "(SELECT id FROM estabelecimento WHERE designacao='"+estab+"'))";
									 break;
				
				/* [ -lD ] Lista o pessoal Doutorado, com recurso ao ano e estabelecimento */
				case 5: expression = "SELECT nome FROM docente WHERE id in "+
									 "(SELECT docente_id FROM registodocencia WHERE ano="+ano+" AND grau_id in "+
									 "(SELECT id FROM grau WHERE ciclo_estudos_id=3) AND estabelecimento_id in "+
									 "(SELECT id FROM estabelecimento WHERE designacao='"+estab+"'))"; 
									 break;
				
				/* [ -lM ] Lista o pessoal que mudou de instituição, com recurso ao ano */
				case 6: expression = "SELECT nome FROM docente WHERE id in "+ 
									 "(SELECT docente_id  FROM registodocencia WHERE ano="+ano+") "+
									 "EXCEPT "+
									 "SELECT nome FROM docente WHERE id in "+ 
									 "(SELECT docente_id  FROM registodocencia WHERE ano="+(Convert.ToInt16(ano)+1)+")";
									 break;
			}
			
			/* Realiza a ligação à BD e executa os comandos SQL. Retorna um Lista! */
			try{
				db.connect();
				IDataReader dr = db.command(expression);
				
				while(dr.Read())
				{
					list.Add(dr.GetString(0));
				}
				list.Sort();
				db.close();
			
				new XML(list);
					
			}catch{
				return list;
			}
			return list;
		}
	}
}

